package com.ysj.aipicturebe.manager.websocket.disruptor;

import cn.hutool.core.thread.ThreadFactoryBuilder;
import com.lmax.disruptor.dsl.Disruptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * 图片编辑事件 Disruptor 配置
 * 这个配置类 PictureEditEventDisruptorConfig 主要用于配置并初始化图片编辑事件的 Disruptor 环形缓冲区，
 * 创建 Disruptor 实例，并将其作为 Spring Bean 注入到容器中，绑定消费者。
 * 它通过 Spring 的 @Configuration 和 @Bean 注解，将 Disruptor 作为一个 Spring Bean 注入到容器中。
 * 这样可以实现高性能的事件处理，适用于图片编辑等高并发场景。
 */
@Configuration // 声明为 Spring 配置类
public class PictureEditEventDisruptorConfig {

    @Resource // 注入图片编辑事件的处理器
    private PictureEditEventWorkHandler pictureEditEventWorkHandler;

    @Bean("pictureEditEventDisruptor") // 注册 Disruptor Bean，名称为 pictureEditEventDisruptor
    public Disruptor<PictureEditEvent> messageModelRingBuffer() {
        // 定义 ringBuffer 的大小，必须为 2 的幂
        int bufferSize = 1024 * 256;
        // 创建 Disruptor 实例，指定事件工厂、缓冲区大小和线程工厂
        Disruptor<PictureEditEvent> disruptor = new Disruptor<>(
                PictureEditEvent::new, // 事件工厂，创建 PictureEditEvent 实例
                bufferSize, // 环形缓冲区大小
                ThreadFactoryBuilder.create().setNamePrefix("pictureEditEventDisruptor").build() // 线程工厂，设置线程名前缀
        );
        // 设置消费者，使用注入的事件处理器处理事件
        disruptor.handleEventsWithWorkerPool(pictureEditEventWorkHandler);
        // 启动 Disruptor
        disruptor.start();
        // 返回 Disruptor 实例，作为 Spring Bean 注入
        return disruptor;
    }
}